// 写一个redux对象，用于存储本项目中公用的数据
// redux集中式数据管理 全局数据只放在一个对象中 state，单向数据流，不能在外部直接修改
// 修改只能统计纯函数reducer来完成，reducer修改后返回一个新的state数据[深复制]
// state数据它不是响应式的，如果你需要通知刚刚显示的组件中更新，还需要手动的来订阅

const createStore = reducer => {
  let state = undefined
  let tasks = new Set()

  // 获取
  const getState = () => state

  // 修改
  const dispatch = actionCreator => {
    if ({}.toString.call(actionCreator) !== '[object Object]') {
      throw new Error('dispatch方法能是一个json对象')
    }
    if (!actionCreator.type) {
      throw new Error('dispatch方法能是一个json对象,且一定要有type属性')
    }

    // reducer纯函数来修改,并且返回一个新的state对象
    state = reducer(state, actionCreator)

    // 更新完毕数据后，通过刚刚订阅列表更新
    tasks.forEach(cb => cb())
  }

  // 订阅
  const subscribe = updaterFn => {
    tasks.add(updaterFn)
    return () => tasks.delete(updaterFn)
  }

  // 初始化
  dispatch({ type: '@@INIT@@' })

  return {
    getState,
    dispatch,
    subscribe
  }
}

export default createStore
